home *** CD-ROM | disk | FTP | other *** search
- /* Generated by EasyCODE(SPX) V6.0 at 02.04.1996 14:19:21
- with C:\EASY\SPL4.CFG */
-
- /* CONWAY - Game */
-
- CONWAY_GAME: PROC OPTIONS (MAIN);
- /* Declarations */
- DCL ITS_CONVNCH ENTRY (FIXED(31) BINARY, CHAR(11));
-
- DCL PRINTC ENTRY (CHAR (*), INTEGER);
- DCL READC ENTRY (CHAR (*), INTEGER, BIT (1));
-
-
- DCL (I, J) INTEGER;
- DCL STEPNUMBER INTEGER(31);
- DCL STEPNUMBER_VALID BIT (1) INIT('0'B);
- DCL NUMBER_OUTPUTS INTEGER(31);
- DCL NUMBER_OUTPUTS_VALID BIT (1) INIT('0'B);
- DCL NEW_FIGURE_DESIRED BIT (1) INIT('1'B);
-
- DCL (OUTPUT, GAMESTEP) ENTRY INTERNAL;
- /* Subprocedures and function procedures */
- /* USER_WANTS_AGAIN */
- USER_WANTS_AGAIN: PROC RETURNS (BIT(1));
- DCL USER_RESPONSE CHAR;
- DCL READ_OK BIT (1);
- DO WHILE ('1'B);
- CALL PRINTC ('ENTER: S,C,G,O,A OR ?', 30);
- READ_OK = '1'B;
- CALL READC (USER_RESPONSE, 1, READ_OK);
- IF NOT (READ_OK)
- THEN DO;
- GOTO READ_ERROR;
- END;
- DO CASE USER_RESPONSE;
- WHEN ('S') DO;
- RETURN ('0'B);
- END;
- WHEN ('C') DO;
- RETURN ('1'B);
- END;
- WHEN ('G') DO;
- STEPNUMBER_VALID = '0'B;
- RETURN ('1'B);
- END;
- WHEN ('O') DO;
- STEPNUMBER_VALID = '0'B;
- NUMBER_OUTPUTS_VALID = '0'B;
- RETURN ('1'B);
- END;
- WHEN ('A') DO;
- NEW_FIGURE_DESIRED = '1'B;
- STEPNUMBER_VALID = '0'B;
- NUMBER_OUTPUTS_VALID = '0'B;
- RETURN ('1'B);
- END;
- WHEN ('?') DO;
- CALL PRINTC ('S = STOP', 11);
- CALL PRINTC ('C = CONTINUE WITHOUT CHANGES', 34);
- CALL PRINTC ('G = CHANGE NUMBER OF GAMESTEPS '
- CAT 'BETWEEN TWO OUTPUTS'
- CAT ', THEN CONTINUE', 72);
- CALL PRINTC ('O = CHANGE NUMBER OF OUTPUTS '
- CAT 'UNTIL NEXT INPUT '
- CAT 'AND NUMBER OF GAMESTEPS '
- CAT 'BETWEEN OUTPUTS'
- CAT ', THEN CONTINUE', 114);
- CALL PRINTC ('A = START AGAIN', 19);
- END;
- OTHERS DO;
- END;
- END;
- END;
- RETURN ('0'B);
- END; /* End Function */
-
- /* NUMVALUE */
- NUMVALUE: PROC (INPUT_STRING) RETURNS (INTEGER(31));
- DCL INPUT_STRING CHAR(11);
-
-
- DCL (START_ADDR,
- END_ADDR) POINTER;
- DCL START_CHARACTER CHAR BASED (START_ADDR);
- DCL END_CHARACTER CHAR BASED (END_ADDR);
- DCL RESULT INTEGER(31);
- DCL 1 CHAR_DESCRIPTION MODEL,
- 2 REPRESENTS_FIGURE BIT(1),
- 2 VALUE_OF_FIGURE INTEGER;
- DCL CH_DESCR MODE (CHAR_DESCRIPTION);
-
- DCL DESCRIBE_CHAR ENTRY (CHAR)
- RETURNS (MODE (CHAR_DESCRIPTION))
- INTERNAL;
- /* DESCRIBE_CHAR */
- DESCRIBE_CHAR: PROC (CHAR_IN)
- RETURNS (MODE (CHAR_DESCRIPTION));
- DCL CHAR_IN CHAR;
- DCL 1 CHAR_IN_STRUC DEF CHAR_IN,
- 2 HALFBYTE_1 BIT (4) UNAL,
- 2 HALFBYTE_2 INTEGER (4) UNAL;
- DCL DESCRIPTION MODE (CHAR_DESCRIPTION);
- IF (CHAR_IN_STRUC.HALFBYTE_1 = 'F'X)
- AND (CHAR_IN_STRUC.HALFBYTE_2 < 10)
- THEN DO;
- DESCRIPTION.REPRESENTS_FIGURE = '1'B;
- DESCRIPTION.VALUE_OF_FIGURE = CHAR_IN_STRUC.HALFBYTE_2;
- END;
- ELSE DO;
- DESCRIPTION.REPRESENTS_FIGURE = '1'B;
- END;
- RETURN (DESCRIPTION);
- END; /* End Function */
-
- RESULT = 0;
- SEARCH_BEGIN:
- DO START_ADDR = ADDR(INPUT_STRING)
- TO ADDR(INPUT_STRING) + 10;
- IF START_CHARACTER NE ' '
- THEN DO;
- CH_DESCR = DESCRIBE_CHAR (START_CHARACTER);
- IF CH_DESCR.REPRESENTS_FIGURE
- THEN DO;
- BREAK SEARCH_BEGIN;
- END;
- ELSE DO;
- RETURN (0);
- END;
- END;
- END;
-
- SEARCH_END
- DO END_ADDR = ADDR(INPUT_STRING) + 10 BY (-1) TO START_ADDR;
- IF END_CHARACTER NE ' '
- THEN DO;
- CH_DESCR = DESCRIBE_CHAR (END_CHARACTER);
- IF CH_DESCR.REPRESENTS_FIGURE
- THEN DO;
- BREAK SEARCH_END;
- END;
- ELSE DO;
- RETURN (0);
- END;
- END;
- END;
-
- /* GETVALUE */
- DO START_ADDR = START_ADDR TO END_ADDR;
- CH_DESCR = DESCRIBE_CHAR (START_CHARACTER);
- IF CH_DESCR.REPRESENTS_FIGURE
- THEN DO;
- RESULT = RESULT * 10 + CH_DESCR.VALUE_OF_FIGURE;
- END;
- ELSE DO;
- RETURN (0);
- END;
- END;
- RETURN (RESULT);
- END; /* End Function */
-
- /* NEW_NUMBER */
- NEW_NUMBER: PROC (TEXT, TEXT_LENGTH, NUMBER);
- DCL TEXT_LENGTH INTEGER;
- DCL TEXT CHAR (TEXT_LENGTH);
- DCL NUMBER INTEGER (31);
- DCL NUMBER_CH CHAR (11);
- DCL READ_OK BIT (1);
- CALL PRINTC (TEXT, TEXT_LENGTH);
- READ_OK = '1'B;
- DO WHILE ('1'B);
- CALL READC (NUMBER_CH, 11, READ_OK);
- IF READ_OK
- THEN DO;
- NUMBER = NUMVALUE (NUMBER_CH);
- IF NUMBER = 0
- THEN DO;
- CALL PRINTC
- ('INVALID NUMBER. REENTER.',
- 36);
- END;
- END;
- ELSE DO;
- GOTO READ_ERROR;
- END;
- IF NOT (NUMBER = 0)
- THEN BREAK;
- END;
- END; /* End Procedure */
-
- /* SET_START_FIGURE */
- SET_START_FIGURE: PROC RECURSIVE;
- DCL MAX_NUMLINES INTEGER(31) CONSTANT (20);
- DCL MAX_NUMCOLUMNS INTEGER(31) CONSTANT (76);
-
- DCL (NUMCOLUMNS,
- NUMCOLS3,
- NUMCOLS4,
- NUMLINES) INTEGER(31) STATIC;
- DCL (WORK1,
- WORK2) CHAR ((MAX_NUMLINES + 2) *
- (MAX_NUMCOLUMNS + 4)) STATIC;
- DCL LINE_NR INTEGER (31);
- DCL (FIELD1_LINE_ADDR,
- FIELD2_LINE_ADDR) (0 : MAX_NUMLINES + 1) PTR STATIC;
- DCL BASE_LINE_ADDR PTR;
- DCL LINE_ADDR (0 : MAX_NUMLINES + 1) PTR
- BASED (BASE_LINE_ADDR);
- DCL NUM_CH CHAR (11);
- DCL 1 NUMCH_STRUC DEFINED NUM_CH,
- 2 BEGIN CHAR (9),
- 2 END_2 CHAR (2);
-
- DCL (HELPPOINTER1,
- HELPPOINTER2) PTR;
- DCL CH2_BASED CHAR (2) BASED (HELPPOINTER1);
- DCL CH2 CHAR (2);
- DCL READ_OK BIT (1);
- DCL LINE CHAR (NUMCOLS4) BASED (HELPPOINTER1);
- DCL 1 LINE_STRUCTURE BASED (HELPPOINTER1),
- 2 INVISIBLE CHAR (1),
- 2 VISIBLE CHAR (NUMCOLS3);
- DCL CH_BASED CHAR BASED (HELPPOINTER1);
- DCL LINE_CHANGED BIT (1);
- /* COMPUTE_LINE */
- COMPUTE_LINE: PROC (DESTLINE_ADDR,
- SOURCELINE1_ADDR,
- SOURCELINE2_ADDR,
- SOURCELINE3_ADDR,
- NUMCOLUMNS);
- DCL (DESTLINE_ADDR,
- SOURCELINE1_ADDR,
- SOURCELINE2_ADDR,
- SOURCELINE3_ADDR) PTR;
- DCL NUMCOLUMNS INTEGER;
- DCL NUMBER_NEIGHBOURS INTEGER(8);
- DCL COLUMN INTEGER;
- DCL DEST (0 : NUMCOLUMNS) CHAR
- BASED (DESTLINE_ADDR);
- DCL SOURCELINE1 (0 : NUMCOLUMNS) CHAR
- BASED (SOURCELINE1_ADDR);
- DCL SOURCELINE2 (0 : NUMCOLUMNS)
- CHAR BASED (SOURCELINE2_ADDR);
- DCL SOURCELINE3 (0 : NUMCOLUMNS) CHAR
- BASED (SOURCELINE3_ADDR);
- DO COLUMN = 1 TO NUMCOLUMNS;
- NUMBER_NEIGHBOURS =
- (SOURCELINE1 (COLUMN - 1) = 'X')
- + (SOURCELINE1 (COLUMN) = 'X')
- + (SOURCELINE1 (COLUMN + 1) = 'X')
- + (SOURCELINE2 (COLUMN - 1) = 'X')
- + (SOURCELINE2 (COLUMN + 1) = 'X')
- + (SOURCELINE3 (COLUMN - 1) = 'X')
- + (SOURCELINE3 (COLUMN) = 'X')
- + (SOURCELINE3 (COLUMN + 1) = 'X');
- DO CASE NUMBER_NEIGHBOURS;
- WHEN (0, 1) DO;
- /* ISOLATION */
- DEST (COLUMN) = ' ';
- END;
- WHEN (2) DO;
- /* SURVIVE */
- DEST (COLUMN) = SOURCELINE2 (COLUMN);
- END;
- WHEN (3) DO;
- /* BIRTH */
- DEST (COLUMN) = 'X';
- END;
- OTHERS DO;
- /* OVERPOPULATION */
- DEST (COLUMN) = ' ';
- END;
- END;
- END;
- RETURN;
- END; /* End Procedure */
-
- DO WHILE ('1'B);
- CALL NEW_NUMBER ('LENGTH OF A LINE ?', 21, NUMCOLUMNS);
- IF NUMCOLUMNS <= MAX_NUMCOLUMNS
- THEN BREAK;
- CALL ITS_CONVNCH (MAX_NUMCOLUMNS, NUM_CH);
- CALL PRINTC (NUMCH_STRUC.END_2 ||
- ' = MAXIMUM NUMBER OF COLUMNS IN THIS VERSION', 45);
- END;
- DO WHILE ('1'B);
- CALL NEW_NUMBER ('NUMBER OF LINES ?', 17, NUMCOLUMNS);
- IF NOT (NUMLINES > MAX_NUMLINES)
- THEN BREAK;
- CALL ITS_CONVNCH (MAX_NUMLINES, NUM_CH);
- CALL PRINTC (NUMCH_STRUC.END_2 ||
- ' = MAXIMUM NUMBER OF LINES IN THIS VERSION', 42);
- END;
- /* Initializations */
- NUMCOLS3 = NUMCOLUMNS + 3;
- NUMCOLS4 = NUMCOLS3 + 1;
-
- WORK1,
- WORK2 = ' ';
-
- HELPPOINTER1 = ADDR (WORK1);
- HELPPOINTER2 = ADDR (WORK2);
- LINE_NR = 0;
- DO WHILE (LINE_NR <= NUMLINES + 1);
- FIELD1_LINE_ADDR (LINE_NR) = HELPPOINTER1;
- FIELD2_LINE_ADDR (LINE_NR) = HELPPOINTER2;
- CALL ITS_CONVNCH (LINE_NR, NUM_CH);
- (HELPPOINTER1 + NUMCOLUMNS + 2) -> CH2_BASED
- = NUMCH_STRUC.END_2;
- (HELPPOINTER2 + NUMCOLUMNS + 2) -> CH2_BASED
- = NUMCH_STRUC.END_2;
- HELPPOINTER1 = HELPPOINTER1 + NUMCOLS3;
- HELPPOINTER2 = HELPPOINTER2 + NUMCOLS3;
- LINE_NR = LINE_NR + 1;
- END;
- GLOBAL1 = ADDR (FIELD1_LINE_ADDR);
- GLOBAL2 = ADDR (FIELD2_LINE_ADDR);
- DO WHILE ('1'B);
- CALL OUTPUT;
- /* Change line */
- LINE_CHANGED = '0'B;
- DO WHILE ('1'B);
- READ_OK = '1'B;
- LINE_CHANGED = '0'B;
- CALL PRINTC ('NUMBER OF LINE TO CHANGE '
- CAT '(2 DIGITS) OR 00', 51);
- CALL READC (CH2,2 , READ_OK);
- IF NOT (READ_OK)
- THEN DO;
- GOTO READ_ERROR;
- END;
- ELSE IF CH2 NE '00'
- THEN DO;
- NUMCH_STRUC.BEGIN = ' ';
- NUMCH_STRUC.END_2 = CH2;
- LINE_NR = NUMVALUE (NUM_CH);
- IF LINE_NR > NUMLINES
- THEN DO;
- CALL PRINTC ('LINE NUMBER TOO HIGH', 21);
- END;
- ELSE DO;
- /* Line number ok */
- HELPPOINTER1
- = FIELD1_LINE_ADDR (LINE_NR) + 1;
- READ_OK = '1'B;
- CALL READC (LINE, NUMCOLUMNS, READ_OK);
- IF NOT (READ_OK)
- THEN DO;
- GOTO READ_ERROR;
- END;
- ELSE DO;
- /* If not 'X' used for marking: */
- HELPPOINTER2
- = HELPPOINTER1 + NUMCOLUMNS;
- DO WHILE (HELPPOINTER1 < HELPPOINTER2);
- IF CH_BASED NE ' '
- THEN DO;
- CH_BASED = 'X';
- END;
- HELPPOINTER1 = HELPPOINTER1 + 1;
- END;
- LINE_CHANGED = '1'B;
- END;
- END;
- END;
- ELSE DO;
- RETURN;
- END;
- IF LINE_CHANGED
- THEN BREAK;
- END;
- END;
- RETURN;
- /* OUTPUT */
- OUTPUT: ENTRY;
- CALL PRINTC (' ', 1);
- DO LINE_NR = 1 TO NUMLINES;
- CALL PRINTC (GLOBAL1 -> LINE_ADDR (LINE_NR) ->
- LINE_STRUCTUR.VISIBLE,
- NUMCOLS3);
- END;
- RETURN;
- /* GAMESTEP */
- GAMESTEP: ENTRY;
- LINE_NR = 1;
- DO WHILE ((LINE_NR <= NUMLINES));
- CALL COMPUTE_LINE
- (GLOBAL2 -> LINE_ADDR (LINE_NR),
- GLOBAL1 -> LINE_ADDR (LINE_NR - 1),
- GLOBAL1 -> LINE_ADDR (LINE_NR),
- GLOBAL1 -> LINE_ADDR (LINE_NR + 1),
- NUMCOLUMNS);
- LINE_NR = LINE_NR + 1;
- END;
- EXCHANGE_SOURCE_AND_DEST:
- HELPPOINTER1 = GLOBAL1;
- GLOBAL1 = GLOBAL2;
- GLOBAL2 = HELPPOINTER1;
-
- RETURN;
- END; /* End Procedure */
-
- /* Implementation */
- DO WHILE (USER_WANTS_AGAIN ());
- IF NEW_FIGURE_DESIRED
- THEN DO;
- CALL SET_START_FIGURE;
- NEW_FIGURE_DESIRED = '0'B;
- END;
- IF NOT (NUMBER_OUTPUTS_VALID)
- THEN DO;
- CALL NEW_NUMBER ('NUMBER OF OUTPUTS UNTIL '
- CAT 'NEXT INPUT', 42,
- NUMBER_OUTPUTS);
- NUMBER_OUTPUTS_VALID = '1'B;
- END;
- IF NOT (STEPNUMBER_VALID)
- THEN DO;
- CALL NEW_NUMBER ('NUMBER OF STEPS BETWEEN TWO OUTPUTS ', 38,
- STEPNUMBER);
- STEPNUMBER_VALID = '1'B;
- END;
- DO I = 1 TO NUMBER_OUTPUTS;
- DO J = 1 TO STEPNUMBER;
- CALL GAMESTEP;
- END;
- CALL OUTPUT;
- END;
- END;
-
- RETURN; /* Normal end of program */
-
- READ_ERROR:
- CALL PRINTC ('READ ERROR!', 11);
- /*1 CALL PRINTC ('SYSDTA NoT (PRIMARY)?', 23); */
- RETURN; /* TERMINATION DUE TO READ ERROR */
-
- END; /* End Procedure */
-
-